package org.example.compent;

import org.example.util.DynamicDatasourceContextHolder;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

/**
 * @author Donald
 * @create 2020-04-18 21:57
 * 动态数据源实现类
 */
public class DynamicDatasource extends AbstractRoutingDataSource {

    private static  byte[] lock = new byte[0];

    private static  DynamicDatasource instance;

    /**
     * 如果希望所有数据源在启动配置时就加载好，这里通过设置数据源Key值来切换数据，定制这个方法
     * 获取与数据源相关的key
     * 此key是Map<String,DataSource> resolvedDataSources 中与数据源绑定的key值
     * 在通过determineTargetDataSource获取目标数据源时使用
     * @return
     */
    @Override
    protected Object determineCurrentLookupKey() {
        return DynamicDatasourceContextHolder.getDatasourceKey();
    }

    /**
     * 设置默认数据源
     * @param defaultDatasource
     */
    public void setDefaultDatasource( Object defaultDatasource){
        super.setDefaultTargetDataSource(defaultDatasource);
    }

    private DynamicDatasource() {
    }

    public static synchronized DynamicDatasource getInstance(){
        if(instance == null)
        {
            synchronized (lock){
                if (instance==null)
                {
                    instance = new DynamicDatasource();
                }
            }
        }
        return instance;
    }
}
